Prior to Windows® NT® version 4.0, the Win32 subsystem used a client-server architecture in which the Graphics Engine (GRE) or core, including the graphics device drivers, executed in a user-mode process (the “server process”) that was distinct from the user-mode application process (the “client process”). For performance reasons, Windows® NT® version 4.0 and subsequent releases switched to a kernel-mode architecture in which the GRE executed entirely in kernel-mode. This change required that the graphics device drivers also execute in kernel-mode. Execution in this mode, however, has a number of inherent restrictions and limitations.
For example, the kernel-mode stack space is limited. In Windows® NT® versions 4.0 and 5.0, the limit is 8 Kbytes. Moreover, the driver may not use native floating-point operations (i.e., float or double data type) on an x86 processor machine. Another limitation is that the driver does not have access to the entire set of Win32 APIs; it is limited to a subset of system services provided by the kernel-mode Win32 subsystem. Additionally, the driver may not call other user-mode components or drivers. The driver programmer is also limited to debugging tools compatible with kernel-mode.
There are problems with system stability as well. An error in the driver may crash the entire operating system (i.e., put the system into an irrecoverable error state that requires the user to reinitialize the computer system). If the driver does not properly manage its resources, it can lose track of and deplete the operating system's resources. For example, if the driver does not free kernel memory allocations after they are no longer needed, the operating system will eventually run out of available memory and halt the system.